package cn.com.pc.content.service.es;

import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.rest.RestStatus;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.builder.SearchSourceBuilder;

import java.io.IOException;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Function;

public interface ESCurdService {
    /**
     * 功能描述: 创建索引
     *
     * @param indexName 索引名称
     */
    String createIndex(String indexName) throws IOException;

    /**
     * 创建索引
     *
     * @param idxName  索引名称
     * @param settings 索引配置信息
     * @param mappings map映射信息
     */
    void createIndex(String idxName, Map<String, Object> settings, Map<String, Object> mappings);

    /**
     * 批处理
     * */
    void bulkOp(BulkRequest bulkRequest);

    /**
     * 功能描述: 删除索引
     *
     * @param indexName 索引名称
     * @return:void
     */
    void deleteIndex(String indexName) throws IOException;

    /**
     * 功能描述: 查询索引
     *
     * @param indexName 索引名称
     * @return:void
     */
    boolean existIndex(String indexName) throws IOException;

    /**
     * 功能描述: 往索引里插入数据
     *
     * @param indexName 索引名称
     * @param docType   数据对象类型，可以把它设置成对象类的类名
     * @param object    数据对象
     * @return:void
     */
    RestStatus insert(String indexName, String docType, Object object) throws IOException;

    /**
     * 功能描述: 往索引里异步插入数据
     *
     * @param indexName
     * @param docType
     * @param object
     */
    void insertAsync(String indexName, String docType, Object object);
    /**
     * 功能描述: 往索引里插入数据，并指定id
     *
     * @param indexName 索引名称
     * @param object    数据对象
     * @return:void
     */
    RestStatus insertWithId(String indexName, String id, Object object) throws IOException;

    /**
     * 批量插入数据
     *
     * @param idxName 索引名称
     * @param list    待插入列表数据
     */
    void insertBatch(String idxName, List<ElasticEntity> list);

    /**
     * 功能描述: 更新数据
     *
     * @param indexName 索引名称
     * @param object    数据对象
     * @return:void
     */
    RestStatus update(String indexName, String id, Object object) throws IOException;

    /**
     * 功能描述: 异步更新数据
     * @param indexName
     * @param id
     * @param object
     */
    public void updateAsync(String indexName, String id, Object object);
    /**
     * 根据 id 更新指定索引中的文档
     */
    RestStatus updateDoc(String idxName, String id, String updateJson) throws IOException;

    /**
     * 批量更新数据
     *
     * @param idxName 索引名称
     * @param list    待插入列表数据
     */
    void updateBatch(String idxName, List<ElasticEntity> list);

    /**
     * 根据查询条件更新索引中的文档
     */
    void updateByQuery(String idxName, QueryBuilder queryBuilder, Map<String, Object> updateData);

    /**
     * 根据查询条件对大数据逐条执行业务
     */
    void updateSearchScroll(SearchSourceBuilder searchSourceBuilder, String idxName, Function<SearchHit, Object> func) throws IOException;

    /**
     * 索引之间导数据
     * */
    void exportData(HashMap<String, String> fieldMap, String fromIndex, String toIndex);

    /**
     * 功能描述: 根据id删除数据
     *
     * @param id _id编号
     * @return:org.elasticsearch.rest.RestStatus
     */
    RestStatus delete(String id) throws IOException;

    /**
     * 根据 id 删除指定索引中的文档
     */
    RestStatus deleteDoc(String idxName, String id) throws IOException;

    /**
     * 批量删除
     */
    <T> void deleteBatch(String idxName, Collection<T> idList);

    /**
     * 批量查询删除
     */
    void deleteByQuery(String idxName, QueryBuilder queryBuilder);

    /**
     * 查询索引是否存在
     */
    boolean existDocById(String indexName, String id) throws IOException;

    /**
     * 往索引里添加新字段
     */
    boolean insertMappingProperty(String indexName, String propName, String propType) throws IOException;
}
